package com.conselheiro.web.beans;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.apache.log4j.Logger;

import com.conselheiro.web.entidade.Avaliacao;
import com.conselheiro.web.entidade.Conselho;
import com.conselheiro.web.entidade.Relato;
import com.conselheiro.web.entidade.enumeration.TipoPost;

/**
 * Bean responsável por lidar com o cadastro de {@link Relato} e {@link Conselho}.
 * 
 * @author jader Abreu
 */
@ManagedBean
@ViewScoped
public class PostBean extends AbstractBean {
	
	private static final long serialVersionUID = 1L;
	private String descricao;
	private TipoPost tipo;
	private String descricaoConselho;
	private TipoPost tipoConselho;
	private Relato relatoSelecionado;
	private Conselho conselhoAvaliado;
	private Avaliacao avaliacaoVisualizada;
	private int avaliacao;
	
    public Relato getRelatoSelecionado() {
		return relatoSelecionado;
	}

	public void setRelatoSelecionado(Relato relatoSelecionado) {
		this.relatoSelecionado = relatoSelecionado;
	}

	public String getDescricaoConselho() {
		return descricaoConselho;
	}

	public void setDescricaoConselho(String descricaoConselho) {
		this.descricaoConselho = descricaoConselho;
	}

	public int getAvaliacao() {
		return avaliacao;
	}

	public void setAvaliacao(int avaliacao) {
		this.avaliacao = avaliacao;
	}

	public TipoPost getTipoConselho() {
		return tipoConselho;
	}

	public void setTipoConselho(TipoPost tipoConselho) {
		this.tipoConselho = tipoConselho;
	}

    public void addError(ActionEvent actionEvent) {  
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Tipo do Relato", "Por favor, selecione um tipo de Relato"));  
    }
    
    public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public TipoPost getTipo() {
		return tipo;
	}

	public void setTipo(TipoPost tipo) {
		this.tipo = tipo;
	}
	
	public void relatar(){
    	if (getTipo() == null) {
    		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Tipo do Relato", "Qual o tipo do relato?"));
    	}
    	else if (getDescricao().isEmpty()) {
    		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Descrição do Relato", "Descreva o seu relato."));
    	}
    	else {
			getFachada().relatar(getFachada().getUsuario(getLogin()), getDescricao(), getTipo());
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Relato de " + getTipo().getDescricao() + " registrado com sucesso", ""));
			logarInfo(Logger.getLogger(getClass()), "Relato registrado: " + getDescricao());
			reset();
    	}
    }
	
	public String aconselhar(){
		getFachada().aconselhar(getFachada().getUsuario(getLogin()), getDescricaoConselho(), getRelatoSelecionado());
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Conselho de " + "------" + " registrado com sucesso", ""));
		logarInfo(Logger.getLogger(getClass()), "Conselho registrado: " + getDescricao());
		reset();
		return "index";
	}
	
	public void seguirRelato(Relato relato) {
		getFachada().seguirRelato(getFachada().getUsuario(getLogin()), relato);
		logarInfo(Logger.getLogger(getClass()), "Seguindo relato: " + getRelatoSelecionado().getDescricao());
		reset();
	}

	public void desfazerSeguirRelato(Relato relato) {
		getFachada().desfazerSeguirRelato(getFachada().getUsuario(getLogin()), relato);
		logarInfo(Logger.getLogger(getClass()), "Seguindo relato: " + getRelatoSelecionado().getDescricao());
		reset();
	}

	public String avaliarConselho(){
		Avaliacao avaliacao = new Avaliacao();
		avaliacao.setValor(getAvaliacao());
		avaliacao.setConselho(getConselhoAvaliado());
		avaliacao.setUsuario(getFachada().getUsuario(getLogin()));
		getFachada().avaliarConselho(avaliacao);
		getFachada().atualizarAvalicaoConselho(conselhoAvaliado);
		return "index";
	}
	
	public Avaliacao getAvaliacaoConselho(Conselho conselho){
		return getFachada().getAvaliacao(getLogin(),conselho);
	}
	
	public void visualizarAvaliacao(Conselho conselho){
		setAvaliacaoVisualizada(getFachada().getAvaliacao(getLogin(), conselho));
	}

	private void reset() {
		setDescricao(null);
		setDescricaoConselho(null);
		setTipo(null);
		setRelatoSelecionado(null);
	}

	public List<Relato> getRelatos() {
    	return getFachada().listarRelatos();
    }

	public Conselho getConselhoAvaliado() {
		return conselhoAvaliado;
	}

	public void setConselhoAvaliado(Conselho conselhoAvaliado) {
		this.conselhoAvaliado = conselhoAvaliado;
	}

	public Avaliacao getAvaliacaoVisualizada() {
		return avaliacaoVisualizada;
	}

	public void setAvaliacaoVisualizada(Avaliacao avaliacaoVisualizada) {
		this.avaliacaoVisualizada = avaliacaoVisualizada;
	}
	
    
}
